package cn.itcast.spark.rdd

import org.apache.spark.{SparkConf, SparkContext}
import org.junit.Test

class Broadcast {

  /**
   * 内存资源占用比较大
   */
  @Test
  def bc1(): Unit = {
    // 数据，假装很大，大概一百兆
    val v = Map("Spark" -> "http://spark.apache.cn", "Scala" -> "http://www.scala-lang.org")

    val conf = new SparkConf().setMaster("local[6]").setAppName("bc")
    val sc = new SparkContext(conf)

    // 将其中的Spark和Scala转为对应的网址
    val r = sc.parallelize(Seq("Spark", "Scala"))
    val result: Array[String] = r.map(item => v(item)).collect()
    result.foreach(println(_))
  }

  /**
   * 使用广播大幅度减少value的创建
   */
  @Test
  def bc2(): Unit = {
    // 数据，假装很大，大概一百兆
    val v = Map("Spark" -> "http://spark.apache.cn", "Scala" -> "http://www.scala-lang.org")

    val conf = new SparkConf().setMaster("local[6]").setAppName("bc")
    val sc = new SparkContext(conf)

    // 创建广播
    val bc = sc.broadcast(v)

    // 将其中的Spark和Scala转为对应的网址
    val r = sc.parallelize(Seq("Spark", "Scala"))

    // 在算子中使用广播变量代替直接引用集合，只会复制和executor一样的数量
    // 在使用广播前，复制map了task数量份
    // 在使用广播以后，复制次数和executor数量一致
    val result = r.map(item => bc.value(item)).collect()
    result.foreach(println(_))
  }

}
